package pro1.双指针.t28;

/**
 * @Author xingyu Xue
 * @Date 2024/2/4 21:23
 * 一个指针指向haystack首位   一个指向needle首位
 */
public class 找字符串第一个匹配的下标 {
    //我写的，大致方法差不多，细节处理不好
    //int r=0; //指向 needle       int l; //指向 haystack
    public static int strStr(String haystack, String needle) {
//        int r=0; //指向 needle
        char[] haystackChars = haystack.toCharArray(),needleChars = needle.toCharArray();
        int n= haystackChars.length, m= needleChars.length;

        for (int l = 0; l <= n-m; l++) {

            int a=l;//原字符串的局部变量
            int r=0; //指向 needle  todo 为什么这个定义放的位置不一样效果还不一杨？  因为写在for循环内部，每次都会重写变为0，是对的！！！
            while ( r< needleChars.length  &&  haystackChars[a]==needleChars[r]   ){  //如果相等。说明第一个字符匹配了，两边都继续往后找
                a++;
                r++;

            }

            if ( r==needleChars.length)  return l;
        }
        return -1;
        
        
    }

    //朴素匹配解法
    public static int strStr2(String haystack, String needle){
        int n=haystack.length(), m=needle.length();
        char[] s=haystack.toCharArray() , p=needle.toCharArray();

        for (int i = 0; i <= n - m; i++) {//todo 为什么是n-m?
            int a=i; //之所以要把i赋值给临时变量a，是因为i要去代表s字符串中的起始位置，局部的循环中用a变量来进行   这就是我写的算法和它的差距 也是我做不出来的原因，
            int b=0;
                            //小知识点：&& 前后的顺序不一样，得到的效果也不一样，应让前面的先满足，否则后面可能会数组下标越界
            while (b<m &&      //b:匹配字符串下标从0开始，要保证其小于匹配字符串长度
                    s[a]==p[b]  //a:相当于原字符串 b是匹配字符串
                     ){
                a++;
                b++;
            }
            // b==m 说明两边完全匹配了，返回下标
            if ( b==m ) return i;
        }
        return -1;

    }



    //kmp算法


}
